/*
 * To change this template, choose Tools | Templates
 * and open the template in the editor.
 */
package br.com.pbs.interfaces;

import br.com.pbs.exeptions.BancoExeption;
import java.util.List;

/**
 *
 * @author Luiz Segundo
 */
public interface IGenericDao<T extends Bean> {

        /**
         * Método capaz de adicionar um Objeto T no banco
         * @param :
         * @return : True Caso o arquivo seja salvo com sucesso
         * @throws BancoExeption : Caso não salve o Objeto no banco lanca essa excecao
         */
        boolean save(T t) throws BancoExeption;

        /**
         * Método capaz de deletar um Objeto T no banco
         * @param :
         * @return : True Caso o arquivo seja deletado com sucesso
         * @throws BancoExeption : Caso não delete o Objeto no  banco lanca essa excecao
         */
        boolean delete(T t) throws BancoExeption;

        /**
         * Método capaz de atualizar um Objeto T no banco
         * @param :
         * @return : True Caso o arquivo seja atualizado com sucesso
         * @throws BancoExeption : Caso não atualize o Objeto no  banco lanca essa excecao
         */
        boolean update(T t) throws BancoExeption;

        /**
         * Método para realizar um busca no banco por ID
         * @param id : Id para verificação
         * @param t : Objeto
         * @return : Objeto encontrado, se NULL o obejto não existi
         * @throws BancoExeption: Caso as Objeto não seja retornada lanca a excecao
         */
        public T buscaPorId(long id, T t) throws BancoExeption;

        /**
         * Método capaz de listar todos os Objeto T no banco
         * @param :
         * @return : Uma lista de Objetos no banco ou NULL caso a lista seja vazia
         * @throws BancoExeption : Caso as lista não seja retornada lanca a excecao
         */
        List<T> listaTodos(T t) throws BancoExeption;

        /**
         * Método para realizar um busca no banco por nome
         * @param nome : nome para verificação
         * @param t : Objeto
         * @return : Objeto encontrado, se NULL o obejto não existi
         * @throws BancoExeption: Caso as Objeto não seja retornada lanca a excecao
         */
        T buscaObjetoPorNome(String nome, T t) throws BancoExeption;

        /**
         * Método para realizar uma lista de Obejtos com o nome especificado
         * @param nome : nome para verificação
         * @param t : Objeto
         * @return : List do tipo Objetos T
         * @throws BancoExeption: Caso as Objeto não seja retornada lanca a excecao
         */
        List<T> listaDeNomes(String nome, T t) throws BancoExeption;

        /**
         *
         *Recupera uma ou varias informações do banco com base em uma atributo passado como parametro da pesquisa
         * e uma string de busca para um classe T qualquer.
         *
         * @param atributo que ser usado na busca(atributo da classe)
         * @param busca uma string de busca
         * @param t a classe para gerar o criteria
         * @return A lista de objetos que apartir desta atributo e da string de busca foram recuperados
         * @throws BancoExeption
         */
        List<T> buscaPorAtributoString(String atributo, String busca, T t) throws BancoExeption;

        T verifica(T valida) throws BancoExeption;
}
